/******************************************************************************
 * 
 * Announce: CSharpKit, Basic algorithms, components and definitions.
 *           Copyright (C) ShenYongchen.
 *           All rights reserved.
 *   Author: 申永辰.郑州 (shenyczz@163.com)
 *  WebSite: http://gitee.com/shenyczz/csharp_csk
 *
 * THIS CODE IS LICENSED UNDER THE MIT LICENSE (MIT).
 * THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF 
 * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
 * IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
 * PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
 * 
******************************************************************************/

namespace CSharpKit
{
    /// <summary>
    /// 名称：泛型目标
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <remarks>
    /// 模板T的基类约束：
    /// <para/> C# 4.0
    /// <list type="bullet">
    /// <item/>where T : class                 ----  T 必须是一个引用类型
    /// <item/>where T : struct                ----  T 必须是一个值类型
    /// <item/>where T : new()                 ----  T 必须要有一个无参构造函数, (即他要求类型参数必须提供一个无参数的构造函数)
    /// <item/>where T : NameOfBaseClass       ----  T 必须继承名为NameOfBaseClass的类
    /// <item/>where T : NameOfInterface       ----  T 必须实现名为NameOfInterface的接口, ITag
    /// </list>
    /// 
    /// <para/> C# 7.3
    /// <list type="bullet">
    /// <item/>where T : Enum                  ----  T 必须是一个枚举类型
    /// <item/>where T : Delegate              ----  T 必须是一个委托类型
    /// <item/>where T : MulticastDelegate     ----  T 必须是一个多路广播委托类型
    /// <item/>where T : unmanaged             ----  T 必须是一个非托管类型
    ///                                       sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal 或 bool
    ///                                       任何枚举类型
    ///                                       任何指针类型
    ///                                       任何用户定义的 struct 类型
    /// </list>
    /// 
    /// <para/> C# 8.0
    /// <list type="bullet">
    /// <item/>where T : notnull               ----  T 必须实现名为NameOfInterface的接口, ITag
    /// </list>
    /// 
    /// <para/> Disable
    /// <list type="bullet">
    /// <item/>Object、Array 和 ValueType
    /// </list>
    /// </remarks>
    public abstract class Target<T> : Target
    {
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public override int GetHashCode()
        {
            return base.GetHashCode()
                ^ (typeof(T)).GetHashCode();
        }

        //}}@@@
    }





}
